package com.game.core.db.service.jedis.params.geo;

import com.game.core.db.service.jedis.Protocol;
import com.game.core.db.service.jedis.params.Params;
import com.game.core.db.service.jedis.util.SafeEncoder;

import java.util.ArrayList;

public class GeoRadiusParam extends Params {
	private static final String WITHCOORD = "withcoord";
	private static final String WITHDIST = "withdist";

	// Do not add WITHHASH since we can't classify result of WITHHASH and WITHDIST,
	// and WITHHASH is for debugging purposes

	private static final String ASC = "asc";
	private static final String DESC = "desc";
	private static final String COUNT = "count";

	private GeoRadiusParam() {
	}

	public static GeoRadiusParam geoRadiusParam() {
		return new GeoRadiusParam();
	}

	public GeoRadiusParam withCoord() {
		addParam(WITHCOORD);
		return this;
	}

	public GeoRadiusParam withDist() {
		addParam(WITHDIST);
		return this;
	}

	public GeoRadiusParam sortAscending() {
		addParam(ASC);
		return this;
	}

	public GeoRadiusParam sortDescending() {
		addParam(DESC);
		return this;
	}

	public GeoRadiusParam count(int count) {
		if (count > 0) {
			addParam(COUNT, count);
		}
		return this;
	}

	public byte[][] getByteParams(byte[]... args) {
		ArrayList<byte[]> byteParams = new ArrayList<byte[]>();
		for (byte[] arg : args) {
			byteParams.add(arg);
		}

		if (contains(WITHCOORD)) {
			byteParams.add(SafeEncoder.encode(WITHCOORD));
		}
		if (contains(WITHDIST)) {
			byteParams.add(SafeEncoder.encode(WITHDIST));
		}

		if (contains(COUNT)) {
			byteParams.add(SafeEncoder.encode(COUNT));
			byteParams.add(Protocol.toByteArray((Integer) getParam(COUNT)));
		}

		if (contains(ASC)) {
			byteParams.add(SafeEncoder.encode(ASC));
		} else if (contains(DESC)) {
			byteParams.add(SafeEncoder.encode(DESC));
		}

		return byteParams.toArray(new byte[byteParams.size()][]);
	}
}
